package com.ys.p5Stack栈;

/**
 * 描述:  数组的模拟实现,大多数都是有限资源,无限竞争
 *   数组模拟实现栈
 *  * 注意：栈的空间长度有限制
 * @author CodeYang
 * @version 2021/1/4 0:57
 */
public class ArrayStack<E> implements Stack<E>{

    /**
     * 栈数组
     */
    private E[] elementData;
    /**
     *  栈顶索引,默认指向栈顶元素,默认值为-1
     */
    private int top = -1;

    /**
     * 无参构造函数,默认初始化 栈空间为10
     */
    public ArrayStack() {
        this(10);
    }

    public ArrayStack(int cap) {
        //处理cap不合法
        if (cap<0){
            throw  new IllegalArgumentException("容量不合法:"+cap);
        }
        // 初始化成员变量,栈数组 强制转换
        elementData = (E[]) new Object[cap];
    }

    /**
     * 入栈操作
     *
     * @param element
     */
    @Override
    public boolean push(E element) {
        //1:处理栈满,栈满返回false
        if (isFull()){
            return false;
        }
        //栈未满 把 element 放入 ++top位置
        elementData[++top] = element;
        // 入栈成功
        return true;
    }

    /**
     * 出栈操作
     *
     * @return
     */
    @Override
    public E pop() {
        // 1: 处理栈空
        if (isEmpty()){
            return null;
        }
        // 栈不空,出栈 先进后出  返回栈顶,也就是操作栈顶元素
        E oldValue = elementData[top];
        // 把栈顶弹出,交给GC回收
        elementData[top] = null;
        // 操作栈顶
        top--;
        return oldValue;
    }

    /**
     * 查看栈顶元素
     *
     * @return
     */
    @Override
    public E peek() {
        // 判断是否栈空,栈空 返回null 不空 返回栈顶元素
        return isEmpty() ? null : elementData[top];
    }

    /**
     * 判断栈是否为空
     *
     * @return 如果栈为空，则返回true；如果栈为非空，则返回false。
     */
    @Override
    public boolean isEmpty() {
        return top == -1;
    }

    /**
     * 判断栈满
     * @return 如果栈已满，则返回true；如果栈未满，则返回false。
     */
    private boolean isFull(){
        return top == elementData.length -1;
    }
}
